package com.h117121.fashionshop.core.tool;

import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.h117121.fashionshop.core.dao.AccountDao;
import com.h117121.fashionshop.core.dao.InvoiceDao;
import com.h117121.fashionshop.core.dao.ProducerDao;
import com.h117121.fashionshop.core.dao.ProductDao;
import com.h117121.fashionshop.core.dao.ProductInInvoiceDao;
import com.h117121.fashionshop.core.dao.ProductTypeDao;
import com.h117121.fashionshop.core.dom.Account;
import com.h117121.fashionshop.core.dom.Account.AccountStatus;
import com.h117121.fashionshop.core.dom.Account.Sex;
import com.h117121.fashionshop.core.dom.Account.UserType;
import com.h117121.fashionshop.core.dom.Invoice;
import com.h117121.fashionshop.core.dom.Invoice.InvoiceState;
import com.h117121.fashionshop.core.dom.Invoice.PaymentMethod;
import com.h117121.fashionshop.core.dom.Producer;
import com.h117121.fashionshop.core.dom.Product;
import com.h117121.fashionshop.core.dom.ProductInInvoice;
import com.h117121.fashionshop.core.dom.ProductType;

@Service("dataGenerator")
public class DataGenerator {
	@Autowired
	private ProductTypeDao productTypeDao;

	@Autowired
	private ProductDao productDao;

	@Autowired
	private ProducerDao producerDao;

	// @Autowired
	// private CommentDao commentDao;

	@Autowired
	private AccountDao accountDao;

	// @Autowired
	// private AdsCustomerDao adsCustomerDao;

	// @Autowired
	// private AdvertisementDao advertisementDao;

	@Autowired
	private InvoiceDao invoiceDao;

	@Autowired
	private ProductInInvoiceDao productInInvoiceDao;

	private static Random random = new Random();
	private static long sequence = 0;

	private static ArrayList<Account> accounts = new ArrayList<Account>();
	private static ArrayList<Product> products = new ArrayList<Product>();
	private static ArrayList<Producer> producers = new ArrayList<Producer>();
	// private static ArrayList<AdsCustomer> customers = new
	// ArrayList<AdsCustomer>();
	private static ArrayList<ProductType> productTypes = new ArrayList<ProductType>();

	private static long nextVal() {
		return sequence++;
	}

	@Transactional
	public void generateData(int maxProductPerProducer,
			int numRegisteredAccounts, int numInvoices, int maxProductPerBill) {
		generateProductType();
		generateAllProducerWithProducts(maxProductPerProducer);
		generateAccounts(numRegisteredAccounts);
		// generateAdsCustomers();
		// generateAdvertisement(numAdvertisement);
		// generateComment(numComments);
		generateInvoices(numInvoices, maxProductPerBill);
	}

	@Transactional
	public void generateInvoices(int numInvoices, int maxProductPerInvoice) {
		for (int i = 0; i < numInvoices; i++) {
			Invoice invoice = new Invoice();
			invoice.setPaymentMethod(random.nextBoolean() ? PaymentMethod.HOME
					: PaymentMethod.ONLINE);
			invoice.setDateCreated(DateUtils.addDays(new Date(), -365 * 3));
			if (random.nextBoolean()) {
				if (random.nextBoolean()) {
					invoice.setState(InvoiceState.PAID);
					invoice.setDatePaid(DateUtils.addDays(
							invoice.getDateCreated(), 10));
				} else {
					invoice.setState(InvoiceState.CANCELED);
				}
			} else {
				invoice.setState(InvoiceState.WAITING);
			}

			int num = random.nextInt(maxProductPerInvoice - 1) + 1;
			ArrayList<ProductInInvoice> list = new ArrayList<ProductInInvoice>();
			for (int j = 0; j < num; j++) {
				// Product product = productDao.getAll().get(
				// random.nextInt(productDao.getAll().size()));
				Product product = products.get(random.nextInt(products.size()));

				ProductInInvoice pii = new ProductInInvoice();
				pii.setProductId(product.getId());
				pii.setName(product.getName());
				pii.setPrice(product.getPrice());
				pii.setQuantity(random.nextInt(10) + 1);
				list.add(pii);
				productInInvoiceDao.saveOrUpdate(pii);
			}
			invoice.setProducts(list);
			invoice.setAccount(accounts.get(random.nextInt(accounts.size())));

			invoiceDao.saveOrUpdate(invoice);
		}
	}

	// private void generateComment(int numComments) {
	// for (int i = 0; i < numComments; i++) {
	// Comment comment = new Comment();
	// comment.setContent(COMMENT_CONTENT[random
	// .nextInt(COMMENT_CONTENT.length)]);
	// comment.setInspected(random.nextBoolean());
	// comment.setAccount(accounts.get(random.nextInt(accounts.size())));
	// comment.setProduct(products.get(random.nextInt(products.size())));
	// Date temp = comment.getAccount().getDateRegistered()
	// .after(comment.getProduct().getDateAdded()) ? comment
	// .getAccount().getDateRegistered() : comment.getProduct()
	// .getDateAdded();
	// comment.setDate(DateUtils.addDays(temp, 3).after(new Date()) ? new Date()
	// : DateUtils.addDays(temp, 3));
	// commentDao.saveOrUpdate(comment);
	// }
	// }

	// private void generateAdvertisement(int numAdvertisement) {
	// for (int i = 0; i < numAdvertisement; i++) {
	// Advertisement ad = new Advertisement();
	// ad.setPosition(i);
	// ad.setStartDate(DateUtils.addDays(new Date(),
	// -1 * random.nextInt(6 * 30)));
	// ad.setExpiredDate(DateUtils.addDays(ad.getStartDate(), 6 * 30));
	// ad.setPrice(random.nextInt(9) * 1000000 + 1000000);
	// ad.setCustomer(customers.get(random.nextInt(customers.size())));
	// advertisementDao.saveOrUpdate(ad);
	// }
	// }

	// private void generateAdsCustomers() {
	// for (int i = 0; i < ADSCUSTOMER_NAME.length; i++) {
	// AdsCustomer customer = new AdsCustomer();
	// customer.setName(ADSCUSTOMER_NAME[i]);
	// customers.add(customer);
	// adsCustomerDao.saveOrUpdate(customer);
	// }
	// }

	private void generateAccounts(int numAccounts) {
		Account test = new Account();
		test.setUserName("test");
		test.setUserPassword("test");
		test.setUserType(UserType.REGISTERED);
		test.setDateRegistered(new Date());
		test.setStatus(AccountStatus.ACTIVE);
		accountDao.saveOrUpdate(test);

		Account admin = new Account();
		admin.setUserName("admin");
		admin.setUserPassword("admin");
		admin.setUserType(UserType.ADMIN);
		admin.setStatus(AccountStatus.ACTIVE);
		admin.setDateRegistered(new Date());
		accountDao.saveOrUpdate(admin);

		for (int i = 0; i < numAccounts; i++) {
			Account account = new Account();
			String firstName = FIRST_NAME[random.nextInt(FIRST_NAME.length)];
			String lastName = LAST_NAME[random.nextInt(LAST_NAME.length)];
			account.setName(firstName + " " + lastName);
			account.setUserName(StringUtils.lowerCase(firstName + lastName)
					+ nextVal());
			account.setUserPassword(RandomStringUtils.randomAlphanumeric(10));
			account.setUserType(UserType.REGISTERED);
			if (random.nextBoolean()) {
				account.setStatus(AccountStatus.ACTIVE);
			} else {
				account.setStatus(AccountStatus.BANNED);
			}
			account.setDateRegistered(DateUtils.addDays(new Date(),
					-1 * random.nextInt(365 * 3)));

			switch (random.nextInt(5)) {
			case 0: {
				account.setSex(Sex.FEMALE);
			}
				break;
			case 1: {
				account.setSex(Sex.MALE);
			}
				break;
			case 2: {
				account.setSex(Sex.GAY);
			}
				break;
			case 3: {
				account.setSex(Sex.LES);
			}
				break;
			default: {
				account.setSex(Sex.UNKNOWN);
			}
				;
			}

			account.setBirthday(DateUtils.addDays(new Date(), -1
					* (18 * 365 + random.nextInt(30) * 365)));
			accounts.add(account);
			accountDao.saveOrUpdate(account);
		}
	}

	private void generateProductType() {
		for (int i = 0; i < PRODUCT_TYPE.length; i++) {
			ProductType type = new ProductType();
			type.setName(PRODUCT_TYPE[i]);
			productTypeDao.saveOrUpdate(type);
			productTypes.add(type);
		}
	}

	private Product generateProduct(Producer producer) {
		Product product = new Product();
		product.setType(productTypes.get(random.nextInt(productTypes.size())));
		product.setName(product.getType().getName() + " "
				+ PRODUCT_NAME[random.nextInt(PRODUCT_NAME.length)]);
		product.setAmountSold(random.nextInt(3000));
		product.setDescription("This product has no description");
		product.setImagePath("images/products/big1.jpg");
		product.setPrice((random.nextInt(950) + 50) * 1000);
		product.setProducer(producer);
		product.setQuantity(random.nextInt(1000));
		product.setDateAdded(DateUtils.addDays(new Date(),
				-1 * random.nextInt(365 * 3)));
		product.setMadeIn(PRODUCT_MADEIN[random.nextInt(PRODUCT_MADEIN.length)]);
		product.setViews(random.nextInt(30000));
		return product;
	}

	private void generateAllProducerWithProducts(int maxProductPerProducer) {
		for (int i = 0; i < PRODUCER_NAME.length; i++) {
			Producer producer = new Producer();
			producer.setName(PRODUCER_NAME[i]);
			producers.add(producer);
			producerDao.saveOrUpdate(producer);

			int numProducts = random.nextInt(maxProductPerProducer);
			for (int j = 0; j < numProducts; j++) {
				Product product = generateProduct(producer);
				products.add(product);
				productDao.saveOrUpdate(product);
			}
		}
	}

	private static String[] COMMENT_CONTENT = new String[] {
			"Sản phẩm rất tốt", "Sản phẩm tốt quá", "Sản phẩm thật tuyệt",
			"Sản phẩm thật đẹp", "Sản phẩm thật là bắt mắt",
			"Sản phẩm thật là xấu", "Sản phẩm xấu quá",
			"Sản phẩm thật là quá ư là xấu", "Sản phẩm thật là vừa túi tiền",
			"Sản phẩm thật là mắc", "Sản phẩm thật là quá mắc" };

	private static String[] ADSCUSTOMER_NAME = new String[] { "Coca-Cola",
			"Pepsi", "Honda", "Yamaha", "Suzuki", "SYM", "Zing", "Facebook",
			"Twitter", "Google", "Vnexpress", "Dân Trí", "Microsoft", "Sun",
			"Nokia", "Samsung", "Sony", "LG", "HTC" };

	private static String[] PRODUCT_MADEIN = new String[] { "Việt Nam", "Mĩ",
			"Nhật", "Anh", "Hàn Quốc", "Trung Quốc", "Hồ Cẩm Đào",
			"Mao Trạch Đông", "Campuchia", "Lào", "Iraq", "Iran", "Ảrập",
			"Trôi nổi", "Lậu", "Xách tay", "Xiđa" };

	private static String[] PRODUCT_NAME = new String[] { "đủ màu", "màu mè",
			"màu trơn", "màu nho", "sọc caro", "rách", "sang trọng", "đẹp",
			"ngầu", "dễ thương", "kute", "cute", "hơi xấu", "rất sang trọng",
			"rất đẹp", "rất dễ thương", "phá cách", "teen", "xì-tai",
			"lòe loẹt", "độc nhất vô nhị", "có một không hai" };

	private static String[] PRODUCT_TYPE = new String[] { "Đồ bộ", "Váy ngắn",
			"Váy quần", "Váy dây", "Áo thun", "Áo khoác", "Áo sơ mi",
			"Áo 3 lỗ", "Áo cánh dơi", "Áo mưa", "Áo ngủ", "Quần dài",
			"Quần ngắn", "Quần jean", "Quần tây" };

	private static String[] PRODUCER_NAME = new String[] { "Thái Tuấn",
			"Việt Tiến", "Chợ Lớn", "Thắng Lợi", "Thành Công", "Ninomax",
			"PT2000", "MO", "Vedan", "Yamaha", "Neptune" };

	private static String[] LAST_NAME = { "Reilly", "Mayo", "Huff", "Lynn",
			"Frank", "Harris", "Gibbs", "Bishop", "Morrow", "Brandt", "Tilley",
			"Clarke", "Nichols", "White", "Bass", "Norris", "Klein", "Currie",
			"Martin", "Mathews", "Bradford", "Weaver", "Knox", "Johnston",
			"Levin", "Wright", "Rodgers", "Doyle", "Reddy", "Hatcher",
			"Palmer", "Porter", "Byrd", "Riggs", "Levy", "Boyd", "Stephenson",
			"Kent", "Rowland", "Shapiro", "Mitchell", "Russell", "Horne",
			"Albright", "Wilkins", "McIntosh", "Gupta", "Davidson", "Ball",
			"Jacobs", "Herbert", "Gillespie", "Cochran", "Singh", "Dale",
			"Noble", "Butler", "Gordon", "Weiss", "Hodge", "Nash", "Wilkinson",
			"McCormick", "Kent", "Small", "Bush", "Bowers", "McLean",
			"Bartlett", "Gold", "Berry", "Stern", "Jackson", "Kendall",
			"Walton", "Rich", "Leach", "Gorman", "Day", "Liu", "Benton", "Kay",
			"Wooten", "Wade", "Abrams", "Barrett", "Manning", "Dickinson",
			"Stewart", "Ashley", "Hernandez", "Kearney", "Brooks", "Garrett",
			"Cole", "Bryant", "Grant", "French", "Winters", "Hewitt", "West",
			"Herring", "Wilder", "Hunter", "Sweeney", "Burke", "Love",
			"Kramer", "Coble", "Williamson", "Spears", "Brown", "Hardison",
			"Morris", "Dennis", "Capps", "Callahan", "Snow", "Gardner",
			"Fields", "Weiss", "Hinson", "Allen", "McCormick", "Combs",
			"Osborne", "Rowland", "Woodruff", "Harmon", "Garrison", "Perez",
			"Browning", "Long", "Dennis", "Dyer", "Henderson", "McCarthy",
			"McGuire", "Katz", "Cherry", "Keller", "McKnight", "Zimmerman",
			"Buckley", "Weiner", "Adams", "McLamb", "Marshall", "Lindsey",
			"Reynolds", "Zhu", "Garrett", "Lassiter", "Burnett", "Ayers",
			"Moody", "Graham", "Avery", "Perkins", "Corbett", "Hess",
			"Ferguson", "Terrell", "Choi", "Shore", "Pugh", "Christian",
			"Schaefer", "Pritchard", "Hunter", "Singleton", "Stewart",
			"Wright", "Woodruff", "Hampton", "Horowitz", "Barnes", "Bradley",
			"Alford", "Gould", "Murray", "Hurley", "Walters", "Wiggins", "Sun",
			"Mercer", "Elmore", "Mueller", "Hood", "Knox", "McNeill",
			"Bradley", "Wells", "Lim", "Gay", "Adkins", "Nash", "Winters",
			"Hull", "Barbee", "Collins", "Conner", "Holmes", "Oliver",
			"Church", "Daniel", "Dean", "Lamm", "Case", "McNeill", "Silver",
			"Lawson", "Clayton", "Barton", "Griffith", "Lucas", "Graham",
			"Tucker", "Fletcher", "Kramer", "Barbour", "Bauer", "McKay",
			"Khan", "Sykes", "Pearce", "Stein", "Hayes", "Berg", "Dixon",
			"Rosenberg", "Gray", "Bridges", "Spence", "Caldwell", "Dudley",
			"Currie", "Horner", "Leonard", "Brewer", "Wong", "Mitchell",
			"Johnson", "Winters", "Lyon", "Raynor", "Boyd", "Lim", "Stark",
			"Brandt", "Young", "Wilson", "Park", "Spivey", "Pierce", "Pickett",
			"Padgett", "Berger", "Owens", "Gold", "Albright", "Mayo",
			"Barefoot", "Garrison", "Barbee", "Duke", "Goldberg", "Zhang",
			"Gray", "Ward", "Michael", "Patton", "Huffman", "Rollins", "Starr",
			"Pridgen", "Horton", "Preston", "Duke", "Creech", "Pope",
			"Daniels", "ONeill", "Schneider", "Osborne", "Copeland", "Hansen",
			"Morrison", "McAllister", "Hoffman", "Carpenter", "Benton", "Lang",
			"Stevenson", "Khan", "Lu", "Ho", "Humphrey", "Bowman", "Starr",
			"Burns", "Hampton", "Sloan", "Wright", "Gray", "Boyette", "Ashley",
			"Jacobs", "Ward", "Washington", "Oakley", "Davies", "Brantley",
			"Carr", "Carver", "Spence", "Cates", "Cooper", "Church", "Ellis",
			"Pope", "Christian", "Dorsey", "Tucker", "Zhu", "Siegel", "Foster",
			"Pearce", "Hendrix", "Allred", "Aldridge", "Zhu", "Tyson", "Ward",
			"Curtis", "Porter", "Morrison", "Yates", "Hauser", "Collier",
			"Collier", "Donovan", "McClure", "Freeman", "Spivey", "Herring",
			"Blackburn", "Young", "Briggs", "Lambert", "Law", "Deal", "Hwang",
			"Jacobson", "Langley", "Erickson", "Mann", "Baxter", "Woodard",
			"Cunningham", "Mann", "Rose", "Walker", "Mayo", "Frye", "Hu",
			"Browning", "Bauer", "Sanders", "Norton", "Blanton", "Kaufman",
			"Odom", "Batchelor", "Field", "Norton", "Mullen", "Horowitz",
			"Haynes", "Hampton", "Nelson", "Cooke", "Wood", "Bell", "Hoyle",
			"Beasley", "Allen", "Hood", "Cline", "Anthony", "Underwood",
			"McKenzie", "Conner", "Lindsay", "Sigmon", "Burgess", "Nguyen",
			"Thompson", "Dougherty", "Hwang", "Cho", "Peele", "Frederick",
			"Blackwell", "Potter", "Hardy", "Bolton", "Hedrick", "Warren",
			"Moody", "Hodge", "Craig", "Griffin", "Small", "Poe", "Petersen",
			"Kerr", "Carlson", "Cook", "Lowry", "Stallings", "Shepherd",
			"Roberts", "Anthony", "Freeman", "Wilkinson", "Ray", "Bowman",
			"Burch", "Maynard", "Morse", "Hines", "Hewitt", "Morris", "Cooper",
			"Currin", "Kelly", "Howe", "Harrell", "Bridges", "Gordon",
			"George", "Herndon", "Cochran", "Hauser", "Stanton", "McLaughlin",
			"McGuire", "Bowden", "Weinstein", "Moss", "Holmes", "Paul",
			"Singh", "Kaufman", "Lamb", "Petty", "Crowell", "Keith", "Wilcox",
			"Hendrix", "Everett", "Beard", "Barrett", "Robbins", "Stark",
			"Bush", "Brantley", "ODonnell", "Carey", "Bartlett", "Rankin",
			"Schroeder", "Wang", "Henson", "Pollock", "Simpson", "Kern",
			"Davis", "Garner", "Reeves", "Christian", "Nicholson", "Kirk",
			"Hammond", "Braswell", "May", "May", "Peele", "Pickett", "Butler",
			"Beck", "Harper", "Beck", "ONeill", "Greer", "Creech", "Block",
			"Weiss", "Braswell", "Briggs", "Park", "Nichols", "Levin",
			"Perkins", "Padgett", "Gay", "Hanna", "Goldstein", "Barton",
			"Hurley", "Bailey", "Davidson", "Coleman", "McIntyre", "Sanders",
			"Fischer", "Dorsey", "Hines", "Parsons", "Berry", "Levine",
			"Rodgers", "Kay", "Drake", "Neal", "Marsh", "Sloan", "Sutherland",
			"Chan", "Cain", "Tan", "Clark", "Hopkins", "Middleton", "Creech",
			"Becker", "Godwin", "Newman", "Zimmerman", "Horne", "Olsen",
			"Siegel", "Herman", "Pace", "Guthrie", "Curtis", "Faulkner",
			"Edwards", "Woodruff", "ONeill", "Foster", "Jackson", "Hendricks",
			"Herring", "Ross", "Shields", "Holloway", "Erickson", "McBride",
			"Burnette", "Faulkner", "Hanson", "Melvin", "Proctor", "Stern",
			"Rosenthal", "Doyle", "Kelley", "Holder", "Pruitt", "Nash", "Gold",
			"Terry", "Swanson", "Lowry", "McMillan", "Kirby", "Underwood",
			"Jordan", "Jacobson", "Schwarz", "McCullough", "Richardson",
			"Walters", "Sanchez", "Bradshaw", "Barr", "Todd", "Crawford",
			"Holder", "McCullough", "Middleton", "Ross", "Perkins", "Donovan",
			"Alston", "Edwards", "Long", "Quinn", "Gill", "Langley", "Meadows",
			"Rouse", "Bridges", "Chan", "Marsh", "Dudley", "Payne", "Goldberg",
			"Mayer", "Whitfield", "Garcia", "Stuart", "McKee", "Moore",
			"Gibbons", "Bennett", "Walters", "Ellis", "Winters", "Lowe",
			"Honeycutt", "George", "Boyd", "Morgan", "Reeves", "House",
			"Sloan", "Buckley", "Lowe", "Ayers", "Byrd", "Block", "Langley",
			"Hood", "Cole", "Snyder", "Wolf", "Black", "Nash", "Wong",
			"Fisher", "Sherrill", "Lloyd", "Lloyd", "Petersen", "Nance",
			"Bloom", "Wright", "Lamm", "Gardner", "Morrison", "Field",
			"Crawford", "Wilder", "Eaton", "Moser", "Kelley", "Meadows",
			"McClure", "McLeod", "Boyle", "Keller", "Nichols", "Keller",
			"Banks", "Day", "King", "Faircloth", "Stallings", "Frederick",
			"Buckley", "Clapp", "Livingston", "Park", "Price", "Pridgen",
			"Hoover", "Simon", "Barr", "Tan", "Stroud", "Harvey", "Reilly",
			"Foley", "Hughes", "Burton", "Garcia", "Jenkins", "Weeks",
			"Melvin", "Hester", "Andrews", "Pratt", "Xu", "Block", "Wooten",
			"Kemp", "Schroeder", "Price", "Kane", "Ivey", "Huang", "Robertson",
			"OBrien", "Cooper", "Zhu", "Boyle", "Knox", "Cook", "Carey",
			"Clayton", "West", "OConnor", "Briggs", "Fisher", "Patton",
			"Schneider", "Braswell", "Thomas", "Dillon", "Houston", "McLamb",
			"Ennis", "House", "Cassidy", "Rubin", "Weiner", "Batchelor", "Lee",
			"York", "Woodward", "Gardner", "McDaniel", "Taylor", "McCormick",
			"Lopez", "Cowan", "Potter", "Rowland", "Payne", "Yang", "Terry",
			"Lindsey", "Whitehead", "Pearson", "Zhou", "Hardin", "Faircloth",
			"Nixon", "Kendall", "Blackburn", "Bland", "McMillan", "Rouse",
			"Briggs", "Walsh", "Mason", "Curry", "Kendall", "McCullough",
			"Sherrill", "Shannon", "Adams", "Frank", "Stokes", "Morgan",
			"Jernigan", "Rowe", "Silverman", "Powell", "Morse", "Boone",
			"Huang", "Barnett", "Cline", "Stevenson", "Gordon", "Neal",
			"Hirsch", "Jensen", "Dickinson", "Beach", "Saunders", "Carson",
			"Ashley", "Kane", "Vaughn", "Arnold", "Middleton", "Roy",
			"Hoffman", "Haynes", "Collins", "Weber", "Sherrill", "Kemp",
			"Mills", "Schwartz", "Underwood", "Humphrey", "Kerr", "Sherman",
			"Grossman", "Wagner", "Brandt", "Huang", "Hutchinson", "Peele",
			"Denton", "Bullock", "Todd", "Liu", "Hernandez", "Thomas",
			"Walters", "Higgins", "Burgess", "Byers", "Yu", "Drake", "Stein",
			"Leach", "Davenport", "Cates", "Barrett", "Eaton", "Albright",
			"Burke", "Pickett", "Peele", "Hardison", "Sims", "Hsu", "Warren",
			"Browning", "Pritchard", "Boykin", "Hewitt", "Middleton",
			"Hammond", "Hester", "Capps", "Saunders", "Dale", "Best", "Ayers",
			"Caldwell", "Merritt", "Cho", "French", "Schmidt", "Huang", "Hall",
			"Braun", "Rice", "Carver", "Bland", "Garner", "Pratt", "McPherson",
			"Herring", "Reese", "Decker", "Joyner", "Ingram", "Simon", "Todd",
			"Conner", "Fleming", "Coates", "Carson", "Mathews", "Sharpe",
			"Levine", "Fields", "Carlson", "York", "Ball", "Lynch", "Bean",
			"Rose", "Middleton", "Bryant", "Stein", "Joyce", "Kendall",
			"Epstein", "Silver", "Combs", "Patrick", "Carson", "Foley",
			"Cummings", "Zimmerman", "Moon", "Vaughan", "Clapp", "Gray",
			"Levine", "Hawley", "Murphy", "Dougherty", "Harris", "Swanson",
			"Bruce", "Lutz", "Curtis", "Ellington", "Daniel", "Katz",
			"Gilbert", "Cameron", "Coley", "Corbett", "Stern", "Harrison",
			"Cannon", "Rivera", "Paul", "Garrison", "Ennis", "Barnes",
			"Burnett", "Pate", "Gregory", "Herbert", "Matthews", "Parks",
			"Reid", "Wood", "Jackson", "Neal", "Craven", "Lowe", "Floyd",
			"Braswell", "Deal", "Hoover", "Doyle", "Walker", "Kirk", "Hinton",
			"House", "McDowell", "Sanders", "Kelley", "Powers", "Huffman",
			"Monroe", "Curtis", "Hwang", "Baird", "Bunn", "Underwood",
			"Sutton", "Dickerson", "McBride", "Rivera", "Hinton", "Scott",
			"Bowen", "Justice", "Chen", "Kessler", "McGee", "Moss", "Morse",
			"Brown", "Pritchard", "Singh", "Clark", "Hughes", "Dorsey",
			"Patterson", "McKenna", "Frederick", "Crowder", "Blanchard",
			"Vincent", "Bynum", "Chen", "Gallagher", "Braswell", "Clements",
			"Jiang", "Horton", "Johnson", "Hsu", "Coates", "Hansen", "Kenney",
			"Schaefer", "Everett", "Ross", "McCormick", "Martin", "Kelly",
			"George", "Justice", "Skinner", "Waller", "McDaniel", "Nichols",
			"Vogel", "Hudson", "Womble", "Berger", "McCarthy", "Gill", "Hale",
			"Waters", "McIntyre", "Coley", "Dyer", "Ellis", "Shore", "Henson",
			"Byrd", "Wall", "Greene", "Bowman", "Hopkins", "Galloway",
			"Norton", "Boyd", "Garrett", "Holland", "Jackson", "Hawkins",
			"Porter", "Collins", "Jacobson", "Abrams", "Jones", "Hale",
			"Leonard", "Adkins", "Knight", "Shannon", "May", "Henry",
			"Alexander", "Kane", "Gunter", "Lambert", "Werner", "Barbee",
			"Adkins", "Lanier", "Lawrence", "Chan", "Fink", "Williams",
			"Allen", "Huff", "Craven", "Barnes", "Dudley", "Lindsey", "Conway",
			"Watkins", "Kennedy", "Lester", "Hauser", "Vincent", "Bishop",
			"Webster", "Gupta", "Hodges", "Burton", "Schmidt", "Greenberg",
			"Bean", "Langley", "Bender", "Hardin", "McNeill", "Hu", "Peck",
			"Whitley", "Holloway", "Creech", "Simpson", "Haynes", "Pierce",
			"Farmer", "Raynor", "Schmidt", "Allen", "Massey", "Goodwin",
			"Epstein", "Stephenson", "Britt", "Yu", "Conrad", "Best", "Bowman",
			"Fowler", "Carlson", "Kay", "Ho", "Rosen", "Harrison", "Craven",
			"Newell", "Conway", "Christian", "Holloway", "Mueller", "Hanna",
			"Farmer", "Cowan", "Browning", "Kay", "Bruce", "Berg", "Porter",
			"Burnette", "Bolton", "Jones", "Frost", "Simpson", "Han", "Horne",
			"Graham", "Hamrick", "Leach", "Maynard", "Kidd", "Ballard",
			"McLean", "Wyatt", "Barry", "Levine", "Day", "Rosenthal", "Bond",
			"Dyer", "Locklear", "Lin", "Ballard", "Willis", "Hutchinson",
			"Schaefer", "McCall", "Petty", "Poe", "Newton", "Flowers",
			"Ballard", "Williams", "Everett", "Talley", "Hwang", "Burke",
			"Bradford", "Knowles", "Harvey", "Chase", "Schroeder", "Heller",
			"Simon", "Robinson", "Kuhn", "Price", "Stokes", "Christensen",
			"Grant", "Archer", "Wyatt", "Flowers", "Young", "Hu", "Huang",
			"Craft", "Ward", "Oh", "Kang", "Pearson", "Wilkerson", "Wiley",
			"Bullock", "Horn", "Lam", "Levy", "Adcock", "Lester", "McKenzie",
			"Knowles", "Faircloth", "Cherry", "Byrne", "Hensley", "Cash",
			"Campbell", "Werner", "Owens", "Shore", "Joseph", "Hall", "Hodge",
			"Nichols", "Ball", "Knowles", "Gibbons", "Swanson", "Chase",
			"Jernigan", "Friedman", "Craig", "McCall", "Francis", "Thompson",
			"Gray", "Bernstein", "Jennings", "Tyson", "McCarthy", "Cooke",
			"Moss", "Strickland", "Singh", "Rankin", "Ward", "Gallagher",
			"Cochran", "Henson", "Middleton", "Moran", "Sun", "Martin",
			"Bowling", "Fitzgerald", "Reynolds", "Davis", "Miles", "Powell",
			"Johnston", "Boyette", "James", "Collins", "Holland", "Jones",
			"Burgess", "Dolan", "Hatcher", "Vaughan", "Osborne", "Hutchinson",
			"Byrne", "George", "Shepherd", "Gentry", "Gibbs", "Simpson",
			"Williford", "Casey", "Desai", "Owen", "Davenport", "Lane",
			"Stephens", "Fitzgerald", "Goodwin", "Faircloth", "Sawyer",
			"Quinn", "Stroud", "Peters", "Buchanan", "King", "Stout", "Reilly",
			"Allred", "Parrott", "McDaniel", "Allison", "Schroeder", "Poe",
			"Lyon", "Howard", "Hampton", "Lin", "Joyce", "Powers", "Byers",
			"Poe", "Conner", "Harrison", "Hansen", "Gentry", "Terry", "Bowers",
			"McKinney", "Rodriguez", "Peacock", "Barrett", "Dudley",
			"Fletcher", "Wooten", "Blackburn", "Marsh", "Carey", "Forbes",
			"Rodriguez", "Duncan", "Crawford", "Horowitz", "Rankin", "Gray",
			"Greenberg", "Spence", "Schneider", "Randall", "Shaw", "Johnson",
			"Dennis", "Lin", "Mullins", "Berman", "Wolfe", "Denton", "Stuart",
			"Avery", "Odom", "Conrad", "Proctor", "Block", "Moon", "Wade",
			"Sharma", "Thompson", "Odom", "Stokes", "Hale", "ONeill", "Gill",
			"Dickinson", "Melvin", "Blanchard", "Hull", "Bray", "Dixon",
			"Pickett", "Mitchell", "Mueller", "Lam", "Mitchell", "Moore",
			"Meyer", "Chappell", "Frye", "Allen", "Merritt", "Martinez",
			"Wang", "Lehman", "Wilkins", "Harris", "Houston", "Barefoot",
			"Hwang", "Knowles", "Dickerson", "Coates", "Quinn", "Livingston",
			"Currin", "McIntyre", "Kidd", "Waters", "Wiley", "High",
			"Grossman", "Moser", "Gould", "House", "Chappell", "McBride",
			"Buckley", "Francis", "Curtis", "Boyd", "Goodwin", "Parrott",
			"Bailey", "Rivera", "Combs", "Sawyer", "Byrne", "Beard", "Wood",
			"Ray", "Cobb", "Wagner", "House", "Boyle", "Fletcher", "Sullivan",
			"Gross", "Kirkland", "Craft", "Gillespie", "Casey", "Ferrell",
			"Pennington", "Norton", "Wolfe", "Shannon", "McIntosh", "Tate",
			"Barbee", "Randall", "Cooper", "Shah", "French", "Harris", "Grady",
			"Berger", "Kessler", "Wells", "McKinney", "Hauser", "Bean", "Ivey",
			"Dodson", "Graham", "Kent", "Abrams", "Goldberg", "Martin",
			"Wilcox", "Dolan", "Hinson", "Woodruff", "Wade", "Moore", "Berry",
			"Carey", "Tate", "Melvin", "Corbett", "Smith", "Fox", "McPherson",
			"Richards", "Rouse", "Mullins", "Blackwell", "Wolfe", "Welch",
			"Dennis", "McIntosh", "Grimes", "Bullock", "Hewitt", "Harmon" };

	private static String[] FIRST_NAME = { "Kristina", "Paige", "Sherri",
			"Gretchen", "Karen", "Caroline", "Janice", "Ernest", "Laura",
			"Phyllis", "Nicholas", "Regina", "Jan", "Diana", "Peggy", "Anne",
			"Leo", "Tammy", "Colleen", "Jordan", "Alice", "Ross", "Louise",
			"James", "Molly", "Joann", "Greg", "Rodney", "Susan", "Natalie",
			"Kristina", "Ralph", "Kristine", "Arlene", "Herbert", "Suzanne",
			"Alison", "Henry", "LeRoy", "Sara", "Jeanne", "Linda", "Carol",
			"Tamara", "Yvonne", "Joann", "Karen", "Danielle", "Darlene",
			"Alvin", "Matthew", "Wade", "Theresa", "Patrick", "Wade", "Steve",
			"Ricky", "Victoria", "Rodney", "Tommy", "Evelyn", "Todd",
			"Mitchell", "Kristin", "Audrey", "Charlene", "James", "Vivian",
			"Gregory", "Arnold", "Kathryn", "Alvin", "Erika", "Judith", "Rose",
			"Marie", "Gilbert", "Denise", "Shelley", "Kristina", "Beverly",
			"Rachel", "Randall", "Toni", "Katie", "Alvin", "Angela", "Clyde",
			"Irene", "Steve", "Bonnie", "Courtney", "Wade", "Sylvia", "Milton",
			"Lillian", "Ben", "Victor", "Linda", "Annie", "Leon", "Marianne",
			"Mildred", "Warren", "Marjorie", "Gail", "Jeff", "Claire",
			"Sheryl", "Susan", "Carmen", "Roy", "Linda", "Frances", "Albert",
			"Derek", "Betty", "Dwight", "Lynda", "Irene", "Tamara", "Kristine",
			"Jesse", "Judy", "Amy", "Jane", "Gerald", "Hilda", "Cecil",
			"Michael", "Thomas", "LeRoy", "Beth", "Ryan", "Joe", "Rebecca",
			"Malcolm", "Marie", "Eugene", "Charlene", "Jessie", "Norma",
			"Anita", "Jessie", "Becky", "Gilbert", "Grace", "Roger", "Faye",
			"Tim", "Leigh", "Karl", "Lester", "Terri", "Karl", "Michelle",
			"Jeffrey", "Gwendolyn", "Jerry", "Donna", "Charlie", "Christopher",
			"Jonathan", "Karl", "Randall", "Sara", "Calvin", "Shawn", "James",
			"Victor", "Neal", "Irene", "Christian", "Sidney", "Kurt",
			"Bernice", "Joanne", "Audrey", "April", "Stacey", "Diane",
			"Alexander", "Penny", "Gretchen", "Janet", "Don", "Erica", "Tara",
			"Ashley", "Marjorie", "Keith", "Ted", "Anita", "Denise", "Ruby",
			"Michael", "Tracy", "Annie", "Patricia", "Keith", "Gordon",
			"Randy", "Carla", "Nicole", "Roberta", "Veronica", "Marlene",
			"Lynne", "Jordan", "Toni", "Harry", "Dale", "Max", "Harriet",
			"Marguerite", "Alfred", "Regina", "Kate", "Eugene", "Linda",
			"Cindy", "Geoffrey", "Lewis", "Lynn", "Rosemary", "Lucille",
			"Benjamin", "Tommy", "Pamela", "Vanessa", "Terry", "Melinda",
			"Marie", "Todd", "Mitchell", "Edgar", "Jacob", "Frederick",
			"Gilbert", "Thelma", "Janet", "Jon", "Patricia", "Gregory", "Nina",
			"Florence", "Sean", "Irene", "Marianne", "Pauline", "Ruby",
			"Julian", "Clifford", "Dennis", "Tom", "Timothy", "Timothy",
			"Natalie", "Gwendolyn", "Wendy", "Erin", "Ann", "Rose", "Curtis",
			"Alexander", "Vicki", "Alex", "Barbara", "Nancy", "Johnny",
			"Sylvia", "Heidi", "Terry", "Geraldine", "Katherine", "Edward",
			"Dawn", "Diana", "Curtis", "Norman", "Henry", "Christian",
			"Leslie", "Randy", "Joel", "Terry", "Glenda", "Adam", "Penny",
			"Carrie", "Tony", "Kay", "Jim", "Rhonda", "Kevin", "Holly",
			"Alice", "Karen", "Glen", "Alice", "Caroline", "Anne", "Ruth",
			"Hannah", "Beverly", "Tiffany", "Leigh", "Anne", "William",
			"Hazel", "Brian", "Joann", "Lynne", "Cecil", "Annette",
			"Christina", "Irene", "Lawrence", "Jim", "Charlotte", "Alice",
			"Vicki", "Rita", "Charles", "Tara", "Gina", "Laurie", "Howard",
			"Maxine", "Victor", "Stacey", "Jimmy", "Gerald", "Vincent",
			"Sheryl", "Jack", "Gloria", "Nina", "Evelyn", "Maureen",
			"Christina", "Leigh", "Hugh", "Pamela", "Brian", "Jesse", "Karen",
			"Vincent", "Jan", "Valerie", "Jacob", "Brooke", "Kristin", "Lynne",
			"Terry", "Danny", "Sam", "Eva", "Anne", "Andrea", "Sheila",
			"Randy", "Harold", "Dwight", "Vicki", "Eileen", "Catherine",
			"Jesse", "Denise", "Caroline", "Jessie", "Virginia", "Rick",
			"Michele", "Harvey", "Debbie", "Richard", "Kristin", "Molly",
			"Jason", "Gerald", "Nancy", "Edward", "Christopher", "Christina",
			"Lauren", "Jesse", "Billy", "Ruby", "Kent", "Florence", "Grace",
			"Eileen", "Jack", "Keith", "Bill", "Gail", "Laurie", "Jordan",
			"Gordon", "Norman", "Gladys", "Geoffrey", "Alex", "Gail", "Faye",
			"Leigh", "George", "Pam", "Katherine", "Brad", "Bernard", "Gayle",
			"Leah", "Leonard", "Phillip", "Courtney", "Warren", "Billy",
			"Regina", "Janet", "Tracy", "Gayle", "Rebecca", "Troy", "Martin",
			"Robyn", "Donna", "Clara", "Toni", "Leigh", "Margaret", "Lindsay",
			"Ellen", "Michael", "Pam", "Keith", "Nicole", "Judy", "Marian",
			"Steve", "Tiffany", "Wendy", "Erica", "Dennis", "Dale", "Alfred",
			"Christopher", "Frank", "Frances", "Colleen", "Jeff", "Karl",
			"Chris", "Norman", "Rita", "Danielle", "Annette", "Anna", "Dean",
			"Melvin", "Sherry", "Anna", "Edna", "Bernice", "Terri", "Wallace",
			"Lillian", "Alex", "Megan", "Lynda", "Ricky", "Toni", "Marvin",
			"Jeff", "Seth", "Sherri", "Frank", "Philip", "Ken", "Katherine",
			"Arlene", "Elizabeth", "Cindy", "Florence", "Gail", "Francis",
			"Marjorie", "Patrick", "Elisabeth", "Leonard", "Timothy",
			"Rosemary", "Marjorie", "Seth", "Oscar", "Billy", "Monica",
			"Debbie", "Douglas", "Benjamin", "Greg", "Bobby", "Jeanne",
			"Francis", "Miriam", "Gary", "Dennis", "Herman", "Elaine",
			"Vincent", "Geraldine", "Lindsay", "Gregory", "Tracey",
			"Jacqueline", "Katherine", "Leonard", "Geoffrey", "Juanita",
			"April", "Janet", "Christopher", "Billy", "Lauren", "Max",
			"Marjorie", "Stacey", "Vivian", "Cynthia", "Kenneth", "Becky",
			"Marc", "Christopher", "Lynn", "Nicole", "Elaine", "Erika", "Faye",
			"Grace", "Gregory", "Wayne", "Neal", "Lauren", "Vivian", "Rebecca",
			"Sam", "Mary", "Claudia", "Marshall", "Tonya", "Patrick", "Lori",
			"Marshall", "Herbert", "Jan", "Lawrence", "Eugene", "Jeanette",
			"Marjorie", "Geoffrey", "Luis", "Leigh", "April", "Shelley",
			"Christy", "Kathleen", "Gene", "Edwin", "Monica", "Harriet",
			"Tony", "Bonnie", "Emily", "Rosemary", "Francis", "Beverly",
			"Lois", "Lynn", "Teresa", "Martha", "Bradley", "Kevin", "Joan",
			"Chris", "Alex", "Ruth", "Ellen", "Donna", "Tina", "Kim", "Calvin",
			"Yvonne", "Colleen", "Ted", "Charlene", "Jacob", "Cameron",
			"Russell", "Vivian", "Jeffrey", "Troy", "Maureen", "Marshall",
			"Jeanne", "Leigh", "Joyce", "Billie", "Pauline", "Ruby", "Norma",
			"Jimmy", "Gregory", "Vicki", "Ralph", "Eugene", "Joy", "Donna",
			"Dwight", "Annette", "Michelle", "Hugh", "Robyn", "Alexandra",
			"Alison", "Bill", "Vincent", "Suzanne", "Jay", "Geoffrey",
			"Gloria", "Jessie", "Beverly", "Nina", "Tracy", "Alice", "Nina",
			"Kevin", "Stacey", "Chris", "Allen", "Laurence", "Philip", "Edna",
			"Catherine", "Lloyd", "Sherri", "Kristine", "Maureen", "Lloyd",
			"Fred", "Christopher", "June", "George", "Nicholas", "Toni",
			"Kent", "Leo", "Bernard", "Paige", "Lillian", "Michele",
			"Lawrence", "Kent", "Jeanne", "June", "Juanita", "Florence", "Dan",
			"Toni", "Philip", "Renee", "Caroline", "Sally", "Stacy", "Sharon",
			"Dorothy", "Annie", "Dwight", "Vivian", "Tom", "Gwendolyn",
			"Phillip", "Jane", "Kristin", "Steven", "Neil", "Marcia", "Becky",
			"Priscilla", "Keith", "Billy", "Dolores", "Leo", "Annie", "Joyce",
			"Carmen", "Pauline", "Fred", "Vicki", "Carlos", "Fred", "Valerie",
			"Christine", "Dwight", "Danielle", "Vincent", "Claude", "Patricia",
			"Guy", "Kathleen", "Tonya", "Sean", "Kevin", "Alan", "Marie",
			"Andrew", "Jacqueline", "Ethel", "Emily", "Edwin", "Holly",
			"Ashley", "Larry", "Ted", "Paula", "Wade", "Kimberly", "Maureen",
			"Phyllis", "Francis", "Gary", "Ellen", "Geoffrey", "Jason",
			"Christian", "Nina", "Michele", "Jason", "Ruby", "Renee", "Peter",
			"Clarence", "Janet", "Hugh", "Marcia", "Paige", "Rodney", "Sara",
			"Martin", "Dorothy", "Clarence", "Cecil", "Elisabeth", "Lauren",
			"Glenda", "Jay", "Sarah", "Joan", "Dolores", "Mary", "Nathan",
			"Linda", "Judy", "Kay", "Wallace", "Steve", "Arnold", "Anne",
			"Meredith", "Lori", "Maureen", "Sean", "Lindsay", "Steven", "Jim",
			"Vickie", "Elizabeth", "Zachary", "Sheryl", "Jenny", "Beverly",
			"Joel", "Craig", "Martha", "Rosemary", "Stacey", "Yvonne", "Don",
			"Lynda", "Ryan", "Joy", "Katharine", "Tim", "Stephanie", "Edith",
			"Mildred", "Randall", "Anna", "Vernon", "Terry", "Keith",
			"Douglas", "Seth", "Gilbert", "Ricky", "Pam", "Kathryn", "Ronald",
			"Gilbert", "Tara", "Earl", "Don", "Jesse", "Anna", "Oscar",
			"Glenn", "Jonathan", "Nelson", "Betsy", "Erica", "Darlene",
			"Russell", "Lillian", "LeRoy", "Irene", "Jonathan", "Nathan",
			"Max", "Holly", "Margaret", "Peter", "Heidi", "Dorothy", "Dorothy",
			"Erik", "Amy", "Tiffany", "Shawn", "Janice", "Jay", "Annie",
			"Michelle", "Floyd", "Brent", "Andrea", "Ronald", "Patricia",
			"Sue", "Tom", "Daniel", "Victoria", "Harold", "Erik", "Katie",
			"Virginia", "Marcia", "Neal", "Renee", "Frances", "Cindy", "Mark",
			"Rodney", "Shelley", "Stephanie", "Kyle", "Rose", "Ray", "Henry",
			"Clara", "Leroy", "Troy", "Brandon", "Holly", "Theresa", "Pat",
			"Marian", "Ray", "Marion", "Dennis", "Bryan", "Lynda", "Norman",
			"Janet", "Holly", "Kyle", "Ronald", "Walter", "Christopher",
			"Shirley", "Sarah", "Jeff", "Gretchen", "Chad", "John", "Clifford",
			"Amy", "Norman", "Alan", "Alicia", "Janice", "Maxine", "Rhonda",
			"Gloria", "Edgar", "Carole", "Karen", "Bryan", "John", "Sandy",
			"Bernice", "Billy", "Laurie", "Leslie", "Bradley", "Floyd",
			"Beverly", "Norman", "Douglas", "Faye", "Stuart", "Brent",
			"Tracey", "Brenda", "Tim", "Michelle", "Christina", "Heidi",
			"Christine", "Carla", "Roger", "Jacqueline", "Craig", "Rodney",
			"Marie", "Kara", "Jean", "Louise", "Penny", "Renee", "Jackie",
			"Diane", "Lynda", "Marsha", "Patsy", "Claude", "Erik", "Valerie",
			"Julie", "Kent", "Charles", "Edward", "Lloyd", "Floyd", "Edward",
			"Bob", "David", "Joann", "Lindsay", "Stuart", "Carlos", "Lester",
			"Edna", "Victoria", "Elizabeth", "Roger", "Bradley", "Charles",
			"Tiffany", "Brian", "Jennifer", "Ray", "Melanie", "Ronald", "Dale",
			"Bradley", "Ann", "Nancy", "Jack", "Marie", "Adam", "Phillip",
			"Marlene", "Jon", "Wayne", "Jeffrey", "Donna", "Crystal", "Julia" };
}
